package gw.com.android.ui.system;

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import android.view.View;
import android.widget.ExpandableListView;

import com.gwtsz.gts2.hx.R;

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import butterknife.BindView;
import butterknife.ButterKnife;
import gw.com.android.app.ActivityManager;
import gw.com.android.app.GTConfig;
import gw.com.android.model.ConfigSettingDeal;
import gw.com.android.utils.CacheUtils;
import www.com.library.app.PushMsgTabFragment;
import www.com.library.model.DataItemDetail;
import www.com.library.model.DataItemResult;

/**
 * 系统设置界面
 *
 * @author reeta
 */
public class AppSettingFragment extends PushMsgTabFragment {

    @BindView(R.id.list_view)
    ExpandableListView listView;
    private SystemSettingAdapter mAdapter;
    private DataItemResult mGroupData;
    private ArrayList<DataItemResult> mResult;
    private ConfigSettingDeal mSettingDeal;
    private String mListTag; //从配置文件获取数据的tag值
    private String mTitle;

    public AppSettingFragment() {

    }

    public static AppSettingFragment newInstance(String mTag, String mTitle) {
        AppSettingFragment fragment = new AppSettingFragment();
        Bundle args = new Bundle();
        args.putString("mTag", mTag);
        args.putString("mTitle", mTitle);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mListTag = getArguments().getString("mTag");
            mTitle = getArguments().getString("mTitle");
        }
    }

    @Override
    protected int getLayoutId() {
        return R.layout.fragment_app_setting;
    }

    @Override
    protected void initLayoutView() {
        ButterKnife.bind(this, mRootView);
        //去掉箭头
        listView.setGroupIndicator(null);
        //不可点击收缩
        listView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {

            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
                return true;
            }
        });
    }


    @Override
    protected void initViewData() {
        readTag();
        if (currentBool) {
            addModifyGestureIdPWD();
        } else {
            removeModifyGestureIdPWD();
        }
        // 默认要根据当前是不是启用了"手势"，
        // 来决定要不要显示修改手势密码
        if (getContext().getResources().getBoolean(R.bool.ifOpenGesturePwdFunction))
            startGestureTagCheckTimer();
    }

    private Handler handler = new Handler(Looper.getMainLooper());

    private void initListView() {
        mSettingDeal = new ConfigSettingDeal();
        mGroupData = new DataItemResult();
        mResult = mSettingDeal.getSettingList(mGroupData, mListTag);
        mAdapter = new SystemSettingAdapter(mGroupData, mResult, getActivity(), null, mSettingDeal);

        listView.setAdapter(mAdapter);
        //所有项全部展开
        for (int i = 0; i < mGroupData.getDataCount(); i++) {
            listView.expandGroup(i);
        }
        mAdapter.setListView(listView, mTitle);
    }

    /**
     * 移除：修改手势密码，这一栏；
     * <p>
     */
    private void removeModifyGestureIdPWD() {
        initListView();
        // 找到修改手势密码那一项，然后提取出来，并且把原list中的这项删掉，然后刷新list;
        //遍历 mResult;
        // 找到，修改手势密码这一项，
        // 如果开关为关闭状态，则从Item中暂时移出去，保存起来，然后刷新list;
        // 如果开关为开启状态，则从Item中将这一项加进去，然后刷新list;
        for (DataItemResult r : mResult) {
            List<DataItemDetail> dataList = r.getDataList();
            for (DataItemDetail d : dataList) {
                boolean isMatch = d.getString("key").equals("modifyGestureIDPWD");//找到这一项
                if (isMatch) {
                    dataList.remove(d);
                    mAdapter.notifyDataSetChanged();
                    break;
                }
            }
        }
    }


    /**
     * 让 修改手势密码，显示出来
     */
    private void addModifyGestureIdPWD() {
        initListView();
    }

    //开启一个Timer，定时检测这个值是不是变化了，如果变化了，按照变化之后的值，
    private Timer timer;
    private boolean currentBool;

    private void readTag() {
        currentBool = GTConfig.instance().getBooleanValue(GTConfig.PRE_OPEN_GESTURE, false);
    }

    /**
     * 特殊处理，这里有个需求：
     * 打开“手势”开关，则显示“修改手势密码”；
     * 关闭“手势”开关，则隐藏“修改手势密码”；
     * 由于不想改动框架内容，不得已在这里用了下策
     */
    private void startGestureTagCheckTimer() {
        timerCancel();

        timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                boolean latestBool = GTConfig.instance().getBooleanValue(GTConfig.PRE_OPEN_GESTURE, false);
                if (currentBool == latestBool) {//如果当前bool和bool相同，则配置没有变化
                    // 无需处理
                } else {//如果不同，就是发生了变化
                    currentBool = latestBool;
                    Runnable runnable;
                    if (latestBool) {//如果最新配置是true，也就是打开了 手势
                        runnable = new Runnable() {
                            @Override
                            public void run() {
                                addModifyGestureIdPWD();
                            }
                        };
                        dispatchEvent();//检查当前是不是有手势密码存于本地内存；
                    } else {
                        runnable = new Runnable() {
                            @Override
                            public void run() {
                                removeModifyGestureIdPWD();
                            }
                        };
                    }
                    handler.post(runnable);
                }

            }
        }, 100, 200);

    }

    private void timerCancel() {
        if (timer != null) {
            timer.cancel();
            timer.purge();
            timer = null;
        }
    }

    private void dispatchEvent() {
        if (TextUtils.isEmpty(CacheUtils.readFile(CacheUtils.get_CACHE_GESTURE_PWD_INT()))) {//如果没有，就说明没有设置过手势，要进入密码先验证密码， 验证通过，再进入手势设置的界面
            ActivityManager.showPwdCheckActivity(getActivity());
        } else {
            //如果有，就说明已经设置过了手势，不用进入密码验证界面；不管他
        }
    }

    /**
     * 刷新界面数据
     */
    public void refreshData() {
        initViewData();
    }
}
